建立好 Schema 之後,下一步就是寫 seed.sql 灌入測試資料。有了假資料,後續開發 PHP 畫面與測試 API 時才不用每次都手動一筆一筆新增。
如果說 schema.sql 是建築物的「空屋藍圖」,那麼 seed.sql 就是在房子蓋好後先搬進去測試的「樣品家具」。
在開發流程中,建立 Seed 資料有四大核心用意:
提供開發時的可視化資料:若資料庫為空,寫 PHP 畫面時將無法確認書籍列表、表格排版與欄位顯示是否正常。
驗證外鍵與約束機制:同時灌入 members、books 與關聯兩者的 loans 紀錄,測試具名外鍵 Constraint 是否正常運作。
快速重置開發環境(一鍵還原):開發「借還書」或「刪除會員」時資料容易被改亂,有了腳本隨時都能一秒還原至初始測試狀態。
提升與 AI (Claude Code) 協作效率:讓 AI 掌握範例資料結構(如 admin 與 member 角色分類),寫出來的程式碼會更精準。
補充說明:
測試資料不會混進正式環境。seed.sql只是開發期間的「輔助道具」。系統正式上線時,只會執行schema.sql建好空白表格,再由使用者註冊或透過腳本批量匯入書籍資料。
seed.sql在 WSL2 專案目錄下啟動 Claude Code,下達以下 Prompt 產生測試資料:
請幫我在 sql/seed.sql 撰寫測試資料灌入腳本:
1. 先 USE library_system;
2. books 表:新增至少 5 本不同類別的書籍,注意 total 與 available 數量要合理。
3. members 表:新增 1 位管理員(role: 'admin')與 2 位一般會員(role: 'member')。
4. loans 表:新增 2 筆借閱紀錄(包含 'borrowed' 借出中與 'returned' 已還書狀態),且 member_id 與 book_id 必須對應剛新增的資料。
seed.sql 範例-- 測試資料灌入腳本
USE library_system;
-- 1. 書籍資料(5 本不同類別,total / available 數量合理)
INSERT INTO books (title, author, isbn, publish_year, category, total, available) VALUES
('台北人', '白先勇', '9789573317009', 1971, '文學小說', 3, 2), -- 1 本借出中
('資料庫系統概論', '王大明', '9789861234567', 2020, '程式設計', 5, 5),
('人類大歷史', '哈拉瑞', '9789869293898', 2014, '歷史', 2, 2), -- 借出後已歸還,補回庫存
('被討厭的勇氣', '岸見一郎', '9789861371215', 2014, '心理勵志', 4, 4),
('三體', '劉慈欣', '9789573330006', 2008, '科幻小說', 3, 3);
-- 2. 會員資料(1 位管理員、2 位一般會員),password 欄位存放雜湊過的密碼,這裡只是測試用的假值
INSERT INTO members (name, email, password, role) VALUES
('管理員', 'admin@library.local', '$2b$10$adminHashPlaceholder0000000000000000000000000', 'admin'),
('王小明', 'wang.member@library.local', '$2b$10$memberHashPlaceholder000000000000000000000000', 'member'),
('李小華', 'lee.member@library.local', '$2b$10$memberHashPlaceholder100000000000000000000000', 'member');
-- 3. 借閱紀錄(1 筆借出中、1 筆已歸還),用子查詢帶入對應的 member_id / book_id,避免寫死流水號
-- 王小明借閱《台北人》,尚未歸還
INSERT INTO loans (member_id, book_id, borrowed_at, due_date, returned_at, status)
SELECT
(SELECT id FROM members WHERE email = 'wang.member@library.local'),
(SELECT id FROM books WHERE isbn = '9789573317009'),
NOW(),
DATE_ADD(CURDATE(), INTERVAL 14 DAY),
NULL,
'borrowed';
-- 李小華借閱《人類大歷史》,已歸還
INSERT INTO loans (member_id, book_id, borrowed_at, due_date, returned_at, status)
SELECT
(SELECT id FROM members WHERE email = 'lee.member@library.local'),
(SELECT id FROM books WHERE isbn = '9789869293898'),
DATE_SUB(NOW(), INTERVAL 20 DAY),
DATE_SUB(CURDATE(), INTERVAL 6 DAY),
DATE_SUB(NOW(), INTERVAL 8 DAY),
'returned';
seed.sql:
cd ~/library-system
sudo mysql -u root < sql/seed.sql
sudo mysql -u root -e "USE library_system; SELECT id, title, available FROM books; SELECT id, name, role FROM members; SELECT * FROM loans\G"
今天透過 Claude Code 生成了具備子查詢動態對應外鍵的 seed.sql 腳本,並在 WSL2 環境下將測試資料灌入 books、members 與 loans 三張資料表中。有了這些樣品資料,資料庫的「骨架與肌肉」就建置完畢了。